<!doctype html>
<html>
<head>
  <title>Test for Bug 852315</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="plugin-utils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>

  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <base href="chrome://browser/content/">
</head>
<body>
<script type="application/javascript">

SimpleTest.waitForExplicitFinish();
setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED);

// Tests that the document-inactive notification stopping plugins does not
// fatally re-enter when adding other plugins to the document.

var i = document.createElement("iframe");
var ob = document.body;
i.addEventListener("load", function loadfunc() {
  var d = i.contentWindow.document;
  var e = i.contentDocument.createElement("embed");
  var destroyran = false;
  e.type = "application/x-test";
  i.contentDocument.body.appendChild(e);

  // On despawn, append an embed tag to document.
  e.callOnDestroy(function() {
    var e2 = d.createElement("embed");
    d.body.appendChild(e2);
    destroyran = true;
  });

  // Navigate the frame to cause the document with the plugin to go inactive
  i.removeEventListener("load", loadfunc);
  i.src = "about:blank";

  const MAX_ATTEMPTS = 50;
  var attempts = 0;
  function checkPluginDestroyRan() {
    // We may need to retry a few times until the plugin stop event makes
    // its way through the event queue.
    if (attempts < MAX_ATTEMPTS && !destroyran) {
      ++attempts;
      SimpleTest.executeSoon(checkPluginDestroyRan);
    } else {
      info("Number of retry attempts: " + attempts);
      ok(destroyran, "OnDestroy callback ran and did not crash");
      SimpleTest.finish();
    }
  }

  SimpleTest.executeSoon(checkPluginDestroyRan);
});
document.body.appendChild(i);

</script>
</body>
</html>
